package code.base;

import cn.hutool.setting.dialect.Props;
import cn.hutool.setting.dialect.PropsUtil;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

/**
 * @author xchen
 * @since 2022-01-20
 */
public class MeiLaiGenerator extends MpGeneratorTemplate {


    public static void main(String[] args) {
        MeiLaiGenerator generator = new MeiLaiGenerator();
        generator.execute();
    }

    @Override
    protected void globalConfig(GlobalConfig globalConfig) {
        globalConfig.setAuthor("xhy");
        globalConfig.setOutputDir("generated-sources/");
        globalConfig.setOpen(false);
        globalConfig.setFileOverride(true);// 是否覆盖同名文件，默认是false
        globalConfig.setActiveRecord(false);// 不需要ActiveRecord特性的请改为false
        globalConfig.setEnableCache(false);// XML 二级缓存
        globalConfig.setBaseResultMap(false);// XML ResultMap
        globalConfig.setBaseColumnList(true);// XML columList
        /* 自定义文件命名，注意 %s 会自动填充表实体属性！ */
        // globalConfig.setMapperName("%sDao");
        // globalConfig.setXmlName("%sDao");
        globalConfig.setServiceName("%sService");
        // globalConfig.setServiceImplName("%sServiceImpl");
        // globalConfig.setControllerName("%sAction");
        globalConfig.setSwagger2(true);
    }

    @Override
    protected void dataSourceConfig(DataSourceConfig dataSourceConfig) {
        dataSourceConfig.setDbType(DbType.MYSQL);
        dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSourceConfig.setUsername("meilai_user");
        dataSourceConfig.setPassword("1qaz2wsx@!");
        dataSourceConfig.setUrl("jdbc:mysql://rm-bp178pv416a8j7b99io.mysql.rds.aliyuncs.com:3306/meilai?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");
    }

    @Override
    protected void strategyConfig(StrategyConfig strategyConfig) {
        Props props = PropsUtil.get("table.properties");
        String tables = props.getStr("tables");
        String[] tableArr = tables.split(",");
        strategyConfig.setCapitalMode(true);// 全局大写命名 ORACLE 注意
        strategyConfig.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
        strategyConfig.setColumnNaming(NamingStrategy.no_change);
        strategyConfig.setInclude(tableArr); // 需要生成的表
        // 控制器为RestController风格
        strategyConfig.setRestControllerStyle(true);
        // 【实体】是否为lombok风格（默认 false）
        strategyConfig.setEntityLombokModel(true);
        // strategyConfig.setTablePrefix(new String[] { "t_" });// 此处可以修改为您的表前缀
        // strategyConfig.setExclude(new String[]{"test"}); // 排除生成的表
        // 自定义实体父类
        strategyConfig.setSuperEntityClass("com.meilai.project.core.bean.SuperEntity");
        // 自定义实体，公共字段
        strategyConfig.setSuperEntityColumns("id");
        // 自定义 mapper 父类
        // strategyConfig.setSuperMapperClass("com.baomidou.demo.TestMapper");
        // 自定义 service 父类
        // strategyConfig.setSuperServiceClass("com.baomidou.demo.TestService");
        // 自定义 service 实现类父类
        // strategyConfig.setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl");
        // 自定义 controller 父类
        // strategyConfig.setSuperControllerClass("com.zhoupu.brm.controller.BaseController");
        // 【实体】是否生成字段常量（默认 false）
        strategyConfig.setEntityColumnConstant(true);
        // 【实体】是否为构建者模型（默认 false）
        // strategyConfig.setEntityBuilderModel(true);

    }

    @Override
    protected void packageConfig(PackageConfig packageConfig) {
        packageConfig.setParent("com.meilai.project");
        packageConfig.setEntity("entity");
        packageConfig.setMapper("mapper");
        packageConfig.setService("service");
        packageConfig.setServiceImpl("service.impl");
        packageConfig.setController("controller");
    }

    @Override
    protected AbstractTemplateEngine templateEngineConfig() {
        return new FreemarkerTemplateEngine();
    }

}
